Есть ли способ динамически создать файл XSL на основе файла XSD - PullRequest
5 голосов
/ 13 февраля 2012

У меня есть проект, в котором мне нужно преобразовать файл XML в файл CSV и наоборот. Я не могу использовать один файл XSL, потому что существуют разные форматы XML и CSV. Итак, мне просто интересно, есть ли способ (любой инструмент или редакторы или любые API-интерфейсы) для создания XSL-файла на основе XSD-файла.

Я также открыт для любых других предложений (я думаю, что не могу избежать XSL, потому что в будущем меня могут попросить преобразовать в другие форматы, такие как pdf, html и т. Д.)

Ответы [ 4 ]

4 голосов
/ 23 февраля 2016

Я понимаю, что это было задано и получено 3 года назад, но я столкнулся с ним, задавая себе тот же вопрос.Краткий ответ - да, конечно, потому что вы просто конвертируете один тип XML в другой (хотя и с некоторыми структурными и синтаксическими изменениями).Я видел это: https://www.oxygenxml.com/archives/xsl-list/200807/msg00601.html - который описывает базовую реализацию в качестве доказательства концепции, и я использовал ее в качестве отправной точки для создания следующего XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="xml" /> 

    <xsl:template match="/">
        <xsl:comment> ............................................................................................... </xsl:comment>

        <xsl:element name="xsl:stylesheet">
            <xsl:namespace name="xsl" select="'http://www.w3.org/1999/XSL/Transform'" /> <xsl:attribute name="version" select="'1.0'" /> 

            <xsl:element name="xsl:output">
                <xsl:attribute name="indent" select="'yes'" />
                <xsl:attribute name="method" select="'xml'" />
            </xsl:element>

            <xsl:comment> ............................................................................................... </xsl:comment>
            <xsl:comment>                                                                                                 </xsl:comment>
            <xsl:comment> ............................................................................................... </xsl:comment>

            <xsl:element name="xsl:template">
                <xsl:attribute name="match" select="'/'" />
                <xsl:element name="xsl:apply-templates">
                    <xsl:attribute name="select" select="'node()'" />
                </xsl:element>
            </xsl:element>

            <xsl:comment> ............................................................................................... </xsl:comment>

            <xsl:element name="xsl:template">
                <xsl:attribute name="match" select="'node()'" />
                <xsl:element name="xsl:if">
                    <xsl:attribute name="test" select="'.!=&apos;&apos;'" />
                    <xsl:element name="xsl:copy"></xsl:element>
                </xsl:element>
            </xsl:element>

            <xsl:comment> ............................................................................................... </xsl:comment>
            <xsl:comment>                                                                                                 </xsl:comment>
            <xsl:comment> ............................................................................................... </xsl:comment>

            <xsl:apply-templates /> 
        </xsl:element>

        <xsl:comment> ............................................................................................... </xsl:comment>
    </xsl:template>

    <xsl:template match="xs:complexType[@name]">
        <xsl:element name="xsl:template">
            <xsl:attribute name="match" select="@name" />
            <xsl:apply-templates /> 
        </xsl:element>
        <xsl:comment> ............................................................................................... </xsl:comment>
    </xsl:template>

    <xsl:template match="xs:complexType[not(@*)]">
        <xsl:element name="xsl:apply-templates">
            <xsl:attribute name="select" select="@name" />
            <xsl:apply-templates /> 
        </xsl:element>
    </xsl:template>

    <!-- xsl:template match="xs:simpleType[@name]">
        <xsl:element name="xsl:apply-templates">
            <xsl:attribute name="select" select="@name" />
            <xsl:apply-templates /> 
        </xsl:element>
    </xsl:template -->

    <xsl:template match="xs:sequence">
        <xsl:element name="xsl:copy">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>

    <xsl:template match="xs:element[@name]">
        <xsl:element name="xsl:apply-templates">
            <xsl:attribute name="select" select="@name" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="xs:attribute">
        <xsl:element name="xsl:apply-templates">
            <xsl:attribute name="select" select="concat( '@', @name )" />
        </xsl:element>
    </xsl:template>

    <!-- xsl:template match="xs:element[@name]">
        <xsl:text>&#xA;&#xA;</xsl:text>
        <xsl:element name="xsl:template">
            <xsl:attribute name="match" select="@name" /> 
            <xsl:text>&#xA;</xsl:text>
            <xsl:comment>
                auto generated stub for element <xsl:value-of select="@name" /> 
            </xsl:comment>
            <xsl:text>&#xA;</xsl:text>
        </xsl:element>
        <xsl:apply-templates /> 
    </xsl:template -->

    <xsl:template match="text()" />

</xsl:stylesheet>

Обратите внимание на использование xsl:element для создания тегов XSLT и создания атрибутов select и match, цитирование в select и экранирование.Блоки comment предназначены для того, чтобы визуально разбить корень документа (сделать его более читабельным), но не служат никакой другой цели.Кроме того, для этого требуется процессор XSLT 2.0.xsltproc пользователям не нужно подавать заявку.

Согласно предыдущим ответам, вам придется изменить его в различной степени для вашего варианта использования.Я сделал это так, чтобы я мог быстро создать точный скелет, из которого я мог бы создать полезный документ XSLT, автоматизируя утомительную основу.

Естественно, я только что потратил часы на разработку и тестирование чего-то, что в этомпункт, который я, вероятно, мог бы сделать быстрее с помощью grep, но по крайней мере это было интересно.Надеюсь, что это кому-то поможет, и улучшения приветствуются.

3 голосов
/ 13 февраля 2012

XSD-файл описывает структуру действительного XML-файла, который соответствует определенным правилам. Файл XSLT описывает, как преобразовать входной XML-документ в некоторую выходную форму, которая может быть или не быть XML. Невозможно вывести XSL-преобразование из XSD-файла, поскольку они затрагивают совершенно разные аспекты XML.

Другими словами, XSD позволяет вам подтвердить, что документ XML соответствует заранее определенному набору ограничений, но ничего не говорит о том, что делать с XML или как преобразовать его во что-то другое.

1 голос
/ 17 февраля 2012

Как сказал Джим Гаррисон, между XSD и XSLT нет простого отображения. Но оба они представляют собой форматы XML, поэтому невозможно сопоставить один другому. В зависимости от общей структуры форматов также можно написать общий XSLT для сопоставления любого XML непосредственно с CSV, если структура достаточно проста.

Вам нужно будет привести несколько примеров данных XML, XSD и ожидаемого результата.

1 голос
/ 13 февраля 2012

Вопреки утверждению в вашем вопросе, вы можете на самом деле использовать один XSLT-файл для преобразования из общего CSV в XML. См .: Конвертер Kernow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...